package observer.deformation;

/**
 * **观察者模式变形：
 * 由于传统观察者模式是由主题也就是被观察者来维护的观察者列表，其实我们可以想一想，
 * 大多数情况，都是观察者去主动观察主题，就比如学生都知道老师的名字，而老师却不能知道所有学生的名字
 * 再比如读者知道作者的名字，而作者却不知道读者的名字，所以观察这个举动，应该是由观察者来发起的；
 * 我们做如下的改动。
 */
public class Client {
    /**
     * 主题标识
     */
    public static final String SUBJECT_NAME = "SUBJECT";

    static Subject subject;
    static ConcreteObserverA concreteObserverA;
    static ConcreteObserverB concreteObserverB;

    public static void main(String[] args) {
        init();
        //观察者主动去关注主题
        concreteObserverA.subscribe(SUBJECT_NAME);
        concreteObserverB.subscribe(SUBJECT_NAME);

        //print: ConcreteObserverA:Concrete Subject is update
        //       ConcreteObserverB:Concrete Subject is update
        subject.change();

        concreteObserverB.unsubscribe(SUBJECT_NAME);
        subject.change();     //print:ConcreteObserverA:Concrete Subject is update
    }

    private static void init() {
        subject = new ConcreteSubject(SUBJECT_NAME);
        concreteObserverA = new ConcreteObserverA();
        concreteObserverB = new ConcreteObserverB();
        //把主题添加到主题管理器去
        SubjectManager.getInstance().addSubject(subject);
        //这里就不再是主题主动去添加观察者了
//        subject.addObserver(concreteObserverA);
//        subject.addObserver(concreteObserverB);
    }
}
